package MainPackage;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */



import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;


/**
 *
 * @author d.chauvistre, n.kaminski
 */
@XmlRootElement
public class User {
    
    private static int maxUserID = 0;
    
    public static enum Geschlecht { 
        maennlich, weiblich  
    };
    public static enum Arbeit {
      vornehmlichStehend, vornehmlichSitzen, koerperlich
    };
    
    private int userID;
    private String name;
    private String passwort;
    private Date geburtsdatum;
    private int groesse;
    private Geschlecht geschlecht; //true = männlich , false=weiblich
    private Arbeit arbeit;
    
    private UserGewicht usergewicht;
    
    private UserReferenzwerte userref;
    
    private List<UserMahlzeit> Mahlzeiten;
    
    private List<UserSport> Sport;
    
    /**
     * Konstruktor
     */
    public User(){        
        this.name="Name";
        this.passwort="Password";
        this.groesse=0;
        this.geschlecht=User.Geschlecht.maennlich;
        this.arbeit=Arbeit.vornehmlichSitzen;
        this.geburtsdatum=new Date();
        this.usergewicht = new UserGewicht();
        this.Mahlzeiten = new ArrayList<UserMahlzeit>();
        this.Sport = new ArrayList<UserSport>();                 
    }
    
    /*
     * Konstruktor
     */
    public User(String name, String passwort, Date geburtsdatum, int groesse, Geschlecht geschlecht, Arbeit arbeit){
        this.userID = (++maxUserID);
        this.name=name;
        this.passwort=sha1(passwort);
        this.groesse=groesse;
        this.geschlecht=geschlecht;
        this.arbeit=arbeit;
        this.geburtsdatum=geburtsdatum;
        this.usergewicht = new UserGewicht();
        this.Mahlzeiten = new ArrayList<UserMahlzeit>();
        this.Sport = new ArrayList<UserSport>();
    }
    
    /**
     * Erzeugt einen SHA1 Hash für einen String. Wird für das Passwort benoetigt.
     * @param input zu verschlüsselnder String
     * @return SHA1 Hash of input
     * @throws NoSuchAlgorithmException 
     */
    public static String sha1(String input){
        try{
        MessageDigest mDigest = MessageDigest.getInstance("SHA1");
        byte[] result = mDigest.digest(input.getBytes());
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < result.length; i++) {
            sb.append(Integer.toString((result[i] & 0xff) + 0x100, 16).substring(1));
        }
        return sb.toString();
        }catch(Exception ex){
            System.exit(1);
            return "";
        }
        
    }
    
    /*
     * Nutzername ausgeben
     */
    public String toString(){
        return this.name+"("+this.userID+")";
    }
    
    /**
     * Einem Nutzer Mahlzeiten hinzufügen
     * @param pNahrungsmittelID ID des Nahrungsmittels
     * @param pMType    Art der Mahlzeit. (Tageszeit)
     * @param pDatum    Datum der Mahlzeit
     * @param pMenge    Menge in g
     */
    public void addMahzeit(int pNahrungsmittelID, UserMahlzeit.MahlzeitType pMType, Date pDatum, int pMenge){
        this.Mahlzeiten.add(new UserMahlzeit(pNahrungsmittelID, pMType, pDatum, pMenge));
    }
    
    /**
     * Mahlzeiten nach Datum abfragen
     * @param tag
     * @param monat
     * @param jahr
     * @return List mit Mahlzeiten eines Tages
     */
    public List<UserMahlzeit> getMahlzeiten_ByDatum(int tag, int monat, int jahr){
        List<UserMahlzeit> um = new ArrayList<UserMahlzeit>();
        Date zwD;
        for(int i = 0; i < Mahlzeiten.size(); ++i){
            zwD = Mahlzeiten.get(i).getDatum();
            if(zwD.getYear() == jahr && zwD.getMonth() == monat && zwD.getDate() == tag){
                um.add(Mahlzeiten.get(i));
            }
        }
        
        return um;
    }
    
    /**
     * Fügt dem User ein neues Gewicht hinzu
     * @param pDatum    Datum des Gewichts
     * @param pGewicht  Gewicht in kg
     */
    public void addGewicht(Date pDatum, float pGewicht){
        this.usergewicht.insert(pGewicht, pDatum);
    }
    
    /**
     * Fügt dem User eine Sporteinheit hinzu
     * @param pName     Name der Sportart
     * @param pDauer    Dauer in Min
     * @param pDatum    Datum des Sports
     */
    public void addSport(String pName, int pDauer, Date pDatum){
        this.Sport.add(new UserSport(pName, pDauer, pDatum));
    }
    
    /**
     * Berechnet Referenzwerte neu
     */
    public void ReferenzwerteNeuBerechnen(){
        this.userref = new UserReferenzwerte(this);
    }
    
    /**
     * get UserReferenzwert
     * @return Referenzwert des Users
     */
    public UserReferenzwerte getUserReferenzwerte(){
        return this.userref;
    }
    
    /**
     * Berechnet Alter anhand des aktuellen Datums und des Geburtsdatums
     * @return akteulles Alter des Users
     */
    public int getAlter()
    {
        GregorianCalendar geburtstag = new GregorianCalendar();
        geburtstag.setTime(getGeburtsdatum());
 
        GregorianCalendar heute = new GregorianCalendar();
 
        int alter = heute.get(Calendar.YEAR) - geburtstag.get(Calendar.YEAR);
 
        if (heute.get(Calendar.MONTH) < geburtstag.get(Calendar.MONTH))
        {
            alter = alter - 1;
        }
        else if (heute.get(Calendar.MONTH) == geburtstag.get(Calendar.MONTH))
        {
            if (heute.get(Calendar.DATE) <= geburtstag.get(Calendar.DATE))
            {
                alter = alter - 1;
            }
        }
 
        return alter;
    }
    
    //<editor-fold defaultstate="collapsed" desc="Getter & Setter für Attribute">
    public static int getMaxUserID(){
        return User.maxUserID;
    }
    public static void setMaxUserID(int maxUserID){
        User.maxUserID = maxUserID;
    }
    public int getUserID(){
        return this.userID;
    }
    public void setUserID(int userID){
        this.userID = userID;
    }    
    public String getName(){
        return this.name;
    }            
    public void setName(String name){
        this.name = name;
    }
    public String getPasswort(){
        return this.passwort;
    }
    public void setPasswort(String passwort){
        this.passwort = passwort;
    }
    public Date getGeburtsdatum(){
        return this.geburtsdatum;
    }
    public void setGeburtsdatum(Date geburtsdatum){
        this.geburtsdatum = geburtsdatum;
    }
    public int getGroesse(){
        return this.groesse;                
    }
    public void setGroesse(int groesse){
        this.groesse = groesse;
    }
    public Geschlecht getGeschlecht(){
        return this.geschlecht;
    }
    public void setGeschlecht(Geschlecht geschlecht){
        this.geschlecht = geschlecht;
    }
    public Arbeit getArbeit(){
        return this.arbeit;
    }
    public void setArbeit(Arbeit arbeit){
        this.arbeit = arbeit;
    }
    
    @XmlElement( name = "Usergewicht" )
    public UserGewicht getUsergewicht(){
        return this.usergewicht;
    }
    public void setUsergewicht(UserGewicht usergewicht){
        this.usergewicht = usergewicht;
    }
    @XmlElement( name = "Mahlzeiten" )
    public List<UserMahlzeit> getMahlzeiten(){
        return this.Mahlzeiten;
    }
    public void setMahlzeiten(List<UserMahlzeit> Mahlzeiten){
        this.Mahlzeiten = Mahlzeiten;
    }
    
    @XmlElement( name = "Usersport" )
    public List<UserSport> getSport(){
        return this.Sport;
    }
    public void setSport(List<UserSport> pSport){
        this.Sport = pSport;
    }
    
    //</editor-fold>
}


